home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / presto / presto10.lha / src / spinlock.C < prev    next >
C/C++ Source or Header  |  1991-12-11  |  2KB  |  112 lines

  1. //
  2. // spinlock.c
  3. //    non-inlined functions for spinlocks
  4. //
  5. // Modification History:
  6. //
  7. // 28-Dec-1989  JEF
  8. // Add class HC_Spinlock (for sequent symmetry only).  This variation of
  9. // a spinlock works well when there is high contention for the lock.
  10. // After original by raj.
  11. //
  12.  
  13. #include <stream.h>
  14. #include "presto.h"
  15.  
  16. void
  17. Spinlock::print(ostream& s)
  18. {
  19.     s << form("(Spinlock)this=0x%x, sl_lock=0x%x", this, this->sl_lock);
  20. }
  21.  
  22. #ifdef mips
  23. extern "C" int atomic_test_and_set(slock_t *);
  24.  
  25. void
  26. s_init_lock(slock_t* l)
  27. {
  28.      *l  = 0;
  29. }
  30.  
  31. void
  32. s_lock(slock_t *l)
  33. {
  34.     while (atomic_test_and_set (l))
  35.     ;
  36. }
  37.  
  38.  
  39. void
  40. s_unlock(slock_t* l)
  41. {
  42.      *l = 0;
  43. }
  44.  
  45.  
  46. int
  47. s_clock(slock_t* l)
  48. {
  49.      return((*l) ? 0 : (*l)++);
  50. }
  51. #endif /* mips */
  52.  
  53.  
  54. #ifdef sun
  55. #ifdef DO_SPINLOCK_INLINE
  56.         //
  57.         // s_lock, s_unlock and s_clock are defined in sun_lock.s
  58.         //
  59.         void s_init_lock(slock_t* l) {
  60.         *l  = 0; 
  61.     }
  62.  
  63.         void s_lock(slock_t *l) { 
  64.         while (*l) ; *l =  1; 
  65.     }
  66.         void s_unlock(slock_t* l) { 
  67.         *l = 0; 
  68.     }
  69.         int s_clock(slock_t* l) { 
  70.         return((*l) ? 0 : (*l)++);
  71.     }
  72. #else
  73.         void Spinlock::~Spinlock() {
  74.                 if (sl_lock)
  75.                         unlock();
  76.         }
  77.  
  78.         void Spinlock::unlock() {
  79.                 (void) S_UNLOCK(&sl_lock);
  80. #   ifndef NO_PREEMPT
  81.                 thisthread->releasingspinlock();
  82. #   endif  NO_PREEMPT
  83.         }
  84.  
  85.         void Spinlock::lock() {
  86. #   ifndef NO_PREEMPT
  87.                 thisthread->holdingspinlock();
  88.  
  89. #   endif NO_PREEMPT
  90.                 (void) S_LOCK(&sl_lock);
  91.         }
  92. #endif /* DO_SPINLOCK_INLINE */
  93. #endif /* sun */
  94.  
  95.  
  96. //
  97. // non-inlined functions for HC_Spinlocks
  98. //
  99. #ifdef sequent
  100. #ifdef i386
  101.  
  102. void
  103. HC_Spinlock::print(ostream& s)
  104. {
  105.     // XXX note: understands what a hc_slock_t looks like...
  106.     s << form("(HC_Spinlock)this=0x%x, sl_lock=0x%x", this, sl_lock.x[0][0]);
  107.     s << "\n";
  108. }
  109.  
  110. #endif /* i386 */
  111. #endif /* sequent */
  112.